package com.item.mall.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.item.mall.entity.Product;
import com.item.mall.entity.ProductCategory;
import com.item.mall.mapper.ProductCategoryMapper;
import com.item.mall.mapper.ProductMapper;
import com.item.mall.service.ProductCategoryService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.item.mall.vo.ProductCategoryVO;
import com.item.mall.vo.ProductVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.stream.Collectors;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author 张津瑞、彭家博
 * @since 2021-07-31
 */
@Service
public class ProductCategoryServiceImpl extends ServiceImpl<ProductCategoryMapper, ProductCategory> implements ProductCategoryService {

    @Autowired
    private ProductCategoryMapper productCategoryMapper ;
    @Autowired
    private ProductMapper productMapper;

    @Override
    public List<ProductCategoryVO> getAllProductCategoryVO() {
        //查询一级分类的商品
        //定义MyBatis Plus查询语句需要用的条件
        QueryWrapper wrapper =new QueryWrapper();
        wrapper.eq("type",1);
        //将符合条件查询出的所有对象封装成ProductCategory集合，取名levelOne
        List<ProductCategory> levelOne = productCategoryMapper.selectList(wrapper);
        //创建一个ProductCategoryVo类型的集合
        //将集合中所有productCategory对象的id和name属性赋给ProductCategoryVo集合
        List<ProductCategoryVO> levelOneVO = levelOne.stream().map(e -> new ProductCategoryVO(e.getId(),e.getName())).collect(Collectors.toList());

        //图片赋值
        for (int i = 0; i < levelOneVO.size(); i++) {
            levelOneVO.get(i).setBannerImg("/images/banner"+i+".png");
            levelOneVO.get(i).setTopImg("/images/top"+i+".png");
            wrapper =new QueryWrapper();
            wrapper.eq("categorylevelone_id",levelOneVO.get(i).getId());
            List<Product> productList = productMapper.selectList(wrapper);
            List<ProductVO> productVOList =productList.stream()
                    .map(e -> new ProductVO(
                            e.getId(),
                            e.getName(),
                            e.getPrice(),
                            e.getFileName()
                    )).collect(Collectors.toList());
            levelOneVO.get(i).setProductVOList(productVOList);
        }


        //遍历一级分类的vo集合，将每一个一级vo对象的id作为条件查询与之符合的二级分类对象集合
        for (ProductCategoryVO productCategoryVO1 : levelOneVO) {
            wrapper =new QueryWrapper();
            wrapper.eq("type",2);
            wrapper.eq("parent_id", productCategoryVO1.getId());
            //查询出与当前一级vo对象的id对应的二级分类对象集合
            List<ProductCategory> levelTwo = productCategoryMapper.selectList(wrapper);
            //创建当前二级分类对象集合相应的vo对象集合
            //将集合中所有二级分类对象的id和name属性赋给相应的vo对象集合
            List<ProductCategoryVO> levelTwoVO = levelTwo.stream().map(e -> new ProductCategoryVO(e.getId(),e.getName())).collect(Collectors.toList());

            //将此一级vo对象相对应的二级vo对象填入其children属性
            productCategoryVO1.setChildren(levelTwoVO);
            //遍历当前二级分类的vo集合，将每一个二级vo对象的id作为条件查询与之符合的三级分类对象集合
            for (ProductCategoryVO productCategoryVO2 : levelTwoVO) {
                wrapper =new QueryWrapper();
                wrapper.eq("type",3);
                wrapper.eq("parent_id", productCategoryVO2.getId());
                //查询出与当前二级vo对象的id对应的三级分类对象集合
                List<ProductCategory> levelThree = productCategoryMapper.selectList(wrapper);
                //创建当前三级分类对象集合相应的vo对象集合
                //将集合中所有三级分类对象的id和name属性赋给相应的vo对象集合
                List<ProductCategoryVO> levelThreeVO = levelThree.stream().map(e -> new ProductCategoryVO(e.getId(),e.getName())).collect(Collectors.toList());

                //将此二级vo对象相对应的三级vo对象填入其children属性
                productCategoryVO2.setChildren(levelThreeVO);
            }
        }

        return levelOneVO;
    }
}
